/**
 * Created by leo on 1/1.
 */
(function () {
    angular.module('commons', [])
        .filter('moment', function () {
            // moment.js locale configuration
            // locale : chinese (zh-cn)
            // author : suupic : https://github.com/suupic
            // author : Zeno Zeng : https://github.com/zenozeng
            (function (factory) {
                if (typeof define === 'function' && define.amd) {
                    define(['moment'], factory); // AMD
                } else if (typeof exports === 'object') {
                    module.exports = factory(require('../moment')); // Node
                } else {
                    factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
                }
            }(function (moment) {
                return moment.defineLocale('zh-cn', {
                    months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
                    monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
                    weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
                    weekdaysShort: '周日_周一_周二_周三_周四_周五_周六'.split('_'),
                    weekdaysMin: '日_一_二_三_四_五_六'.split('_'),
                    longDateFormat: {
                        LT: 'Ah点mm',
                        LTS: 'Ah点m分s秒',
                        L: 'YYYY-MM-DD',
                        LL: 'YYYY年MMMD日',
                        LLL: 'YYYY年MMMD日LT',
                        LLLL: 'YYYY年MMMD日ddddLT',
                        l: 'YYYY-MM-DD',
                        ll: 'YYYY年MMMD日',
                        lll: 'YYYY年MMMD日LT',
                        llll: 'YYYY年MMMD日ddddLT'
                    },
                    meridiem: function (hour, minute, isLower) {
                        var hm = hour * 100 + minute;
                        if (hm < 600) {
                            return '凌晨';
                        } else if (hm < 900) {
                            return '早上';
                        } else if (hm < 1130) {
                            return '上午';
                        } else if (hm < 1230) {
                            return '中午';
                        } else if (hm < 1800) {
                            return '下午';
                        } else {
                            return '晚上';
                        }
                    },
                    calendar: {
                        sameDay: function () {
                            return this.minutes() === 0 ? '[今天]Ah[点整]' : '[今天]LT';
                        },
                        nextDay: function () {
                            return this.minutes() === 0 ? '[明天]Ah[点整]' : '[明天]LT';
                        },
                        lastDay: function () {
                            return this.minutes() === 0 ? '[昨天]Ah[点整]' : '[昨天]LT';
                        },
                        nextWeek: function () {
                            var startOfWeek, prefix;
                            startOfWeek = moment().startOf('week');
                            prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]';
                            return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm';
                        },
                        lastWeek: function () {
                            var startOfWeek, prefix;
                            startOfWeek = moment().startOf('week');
                            prefix = this.unix() < startOfWeek.unix() ? '[上]' : '[本]';
                            return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm';
                        },
                        sameElse: 'LL'
                    },
                    ordinalParse: /\d{1,2}(日|月|周)/,
                    ordinal: function (number, period) {
                        switch (period) {
                            case 'd':
                            case 'D':
                            case 'DDD':
                                return number + '日';
                            case 'M':
                                return number + '月';
                            case 'w':
                            case 'W':
                                return number + '周';
                            default:
                                return number;
                        }
                    },
                    relativeTime: {
                        future: '%s内',
                        past: '%s前',
                        s: '几秒',
                        m: '1分钟',
                        mm: '%d分钟',
                        h: '1小时',
                        hh: '%d小时',
                        d: '1天',
                        dd: '%d天',
                        M: '1个月',
                        MM: '%d个月',
                        y: '1年',
                        yy: '%d年'
                    },
                    week: {
                        // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
                        dow: 1, // Monday is the first day of the week.
                        doy: 4  // The week that contains Jan 4th is the first week of the year.
                    }
                });
            }));

            // REQUIRES:
            // moment.js - https://github.com/moment/momentjs.com

            // USAGE:
            // {{ someDate | moment: [any moment function] : [param1] : [param2] : [param n]

            // EXAMPLES:
            // {{ someDate | moment: 'format': 'MMM DD, YYYY' }}
            // {{ someDate | moment: 'fromNow' }}

            // To call multiple moment functions, you can chain them.
            // For example, this converts to UTC and then formats...
            // {{ someDate | moment: 'utc' | moment: 'format': 'MMM DD, YYYY' }}
            return function (input, momentFn /*, param1, param2, etc... */) {
                if (!input) {
                    return input;
                }
                var args = Array.prototype.slice.call(arguments, 2),
                    momentObj = moment(input);
                return momentObj[momentFn].apply(momentObj, args);
            };
        })
        .factory('moment', function () {
            return moment;
        })
        .directive('highcharts', function () {
            "use strict";
            Highcharts.getOptions().colors = ["#7cb5ec", "#90ed7d", "#f7a35c", "#8085e9", "#f15c80", "#e4d354", "#8d4653", "#91e8e1", "#6b8e23", "#ee82ee", "#800080"];
            return {
                restrict: 'A',
                scope: {
                    options: '=highcharts'
                },
                link: function (scope, elem, attrs) {
                    scope.$watch('options', redraw);
                    function redraw() {
                        if (!scope.options)return;
                        // use default values if nothing is specified in the given settings
                        var optionsCopy = angular.copy(scope.options);
                        if (!optionsCopy.chart) {
                            optionsCopy.chart = {};
                        }
                        optionsCopy.chart.renderTo = elem[0];
                        if (scope.ChartObject) {
                            scope.ChartObject.destroy();
                        }
                        if (optionsCopy.xAxis && optionsCopy.xAxis.allowDecimals === undefined) {
                            optionsCopy.xAxis.allowDecimals = false;
                        }
                        if (optionsCopy.yAxis && optionsCopy.yAxis.allowDecimals === undefined) {
                            optionsCopy.yAxis.allowDecimals = false;
                        }
                        scope.ChartObject = new Highcharts.Chart(optionsCopy);
                    }
                }
            }
        })
        .directive('directive', function ($compile, $timeout) {
            return function (scope, elem) {
                var directiveAttrName = 'directive', expression = elem.attr(directiveAttrName);
                if (expression) {
                    // 非可见区的panel延迟加载
                    $timeout(function () {
                        elem.removeAttr(directiveAttrName).attr(scope.$eval(expression), '');
                        $compile(elem)(scope);
                    }, Math.max(angular.element(elem).offset().top - 400, 0));
                }
            }
        })
        .directive('slickSlider', function ($timeout) {
            return {
                restrict: 'A',
                scope: {
                    options: '=slickSlider'
                },
                link: function (scope, elem, attrs) {
                    scope.$watch('options', function (options) {
                        if (!options)return;
                        $timeout(function () {
                            var slider = $(elem);
                            slider.unslick();
                            slider.find('.slick-list').remove();
                            slider.slick(options || {});
                        });
                    });
                }
            }
        })
        .factory('UUID', function () {
            return function () {
                var id = "", i, random;
                for (i = 0; i < 32; i++) {
                    random = Math.random() * 16 | 0;
                    if (i == 8 || i == 12 || i == 16 || i == 20) {
                        id += "-";
                    }
                    id += (i == 12 ? 4 : (i == 16 ? (random & 3 | 8) : random)).toString(16);
                }
                return id;
            }
        })
        .factory('YAML', function () {
            return {
                parse: jsyaml.load
            }
        })
        .factory('loadConf', function ($http, YAML, Promise) {
            var cache = angular.element.data(angular, 'panel-conf-cache') || {};
            return function (filename) {
                var data = cache[filename];
                if (data) {
                    return Promise.when(data);
                }
                return $http.get('conf/' + filename, {cache: true}).then(function (resp) {
                    return filename.match(/\.yml$/) && angular.isString(resp.data) ? YAML.parse(resp.data) : resp.data;
                });
            }
        })
        .value('urlMap', {})
        .factory('parseHost', function (loadConf, urlMap) {
            var hosts = {};
            loadConf('hosts.yml').then(function (conf) {
                hosts = (conf || {})[location.hostname] || {};
            });
            return function (url) {
                var newUrl = url ? url.replace(/^(https?:\/\/)([^\/]+)(\/.*)$/, function ($, $1, $2, $3) {
                    return $1 + (hosts[$2] || $2) + $3
                }) : url;
                urlMap[newUrl] = url;
                return newUrl;
            }
        })
        .factory('Promise', function ($q) {
            "use strict";
            var Promise = function (constructor) {
                var deferred = $q.defer();
                constructor.call(this, deferred.resolve, deferred.reject, deferred.notify);
                return deferred.promise;
            };
            angular.extend(Promise, $q);
            return Promise;
        });
}());